/*
 * Copyright 2016 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef GrPathStencilSettings_DEFINED
#define GrPathStencilSettings_DEFINED

#include "src/gpu/ganesh/GrUserStencilSettings.h"

// //////////////////////////////////////////////////////////////////////////////
// Stencil rules for paths

// //// Even/Odd

static constexpr GrUserStencilSettings gEOStencilPass(GrUserStencilSettings::StaticInit<0xffff,
    GrUserStencilTest::kAlwaysIfInClip, 0xffff, GrUserStencilOp::kInvert, GrUserStencilOp::kKeep, 0xffff>());

// ok not to check clip b/c stencil pass only wrote inside clip
static constexpr GrUserStencilSettings gEOColorPass(GrUserStencilSettings::StaticInit<0x0000,
    GrUserStencilTest::kNotEqual, 0xffff, GrUserStencilOp::kZero, GrUserStencilOp::kZero, 0xffff>());

// have to check clip b/c outside clip will always be zero.
static constexpr GrUserStencilSettings gInvEOColorPass(GrUserStencilSettings::StaticInit<0x0000,
    GrUserStencilTest::kEqualIfInClip, 0xffff, GrUserStencilOp::kZero, GrUserStencilOp::kZero, 0xffff>());

// //// Winding

static constexpr GrUserStencilSettings gWindStencilPass(GrUserStencilSettings::StaticInitSeparate<0xffff, 0xffff,
    GrUserStencilTest::kAlwaysIfInClip, GrUserStencilTest::kAlwaysIfInClip, 0xffff, 0xffff, GrUserStencilOp::kIncWrap,
    GrUserStencilOp::kDecWrap, GrUserStencilOp::kKeep, GrUserStencilOp::kKeep, 0xffff, 0xffff>());

static constexpr GrUserStencilSettings gWindColorPass(GrUserStencilSettings::StaticInit<0x0000,
    GrUserStencilTest::kLessIfInClip, // "0 < stencil" is equivalent to "0 != stencil".
    0xffff, GrUserStencilOp::kZero, GrUserStencilOp::kZero, 0xffff>());

static constexpr GrUserStencilSettings gInvWindColorPass(GrUserStencilSettings::StaticInit<0x0000,
    GrUserStencilTest::kEqualIfInClip, 0xffff, GrUserStencilOp::kZero, GrUserStencilOp::kZero, 0xffff>());

// //// Normal render to stencil

// Sometimes the default path renderer can draw a path directly to the stencil
// buffer without having to first resolve the interior / exterior.
static constexpr GrUserStencilSettings gDirectToStencil(GrUserStencilSettings::StaticInit<0x0000,
    GrUserStencilTest::kAlwaysIfInClip, 0xffff, GrUserStencilOp::kZero, GrUserStencilOp::kIncMaybeClamp, 0xffff>());

#endif
